home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
libs
/
bestl232
/
!best005.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-04-26
|
5KB
|
160 lines
/*==========================================================================
*
* !BEST005.C Wednesday, April 20, 1994
*
* Linked List Functions
* supplementary source file 5 for The BESTLibrary
*
* Authored independently by George Vanous
*
*==========================================================================*/
/* ------------------------------------------------------------------------ */
/* ---------------------------- INCLUDE FILES --------------------------- */
#include <alloc.h>
#include "!bestlib.h" // include !BESTLIB.H in compilation
/* ------------------------------------------------------------------------ */
/*----------------------------------------------------------------------------
* Search for a node in a linked list.
*
* "node" - node to search for
* "list" - linked list to search through
*
* RETURNS:
* = node of linked list
* = NULL if node not found in linked list
*/
llist *lst_find(llist *node, llist *list)
{
while (list != node && list); // while there is no match and a next node
list = list->next; // hop to next node
return(list); // return "node" of linked list, else NULL
}
/*----------------------------------------------------------------------------
* Deallocate all of the nodes of a singly-linked list.
*
* "list" - singly linked list to deallocate
*
* RETURNS:
* = NULL
*/
llist_single *lst_free_single(llist_single *list)
{
llist_single *tail; // tail of linked list
while (list->next) {
/* get to the node that is just before the tail end of the linked list */
for (tail = list; tail->next->next; tail = tail->next);
free(tail->next); // deallocate tail of linked list
tail->next = NULL; // define new tail of linked list
}
free(list); // deallocate head of linked list
return(NULL);
}
/*----------------------------------------------------------------------------
* Deallocate all of the nodes of a doubly-linked list.
*
* "list" - doubly linked list to deallocate
*
* RETURNS:
* = NULL
*/
llist_double *lst_free_double(llist_double *list)
{
llist_double *tail; // tail of linked list
tail = (llist_double *)lst_tail( (llist *)list); // get to tail
while (list->next) {
tail = tail->prev; // go to previous node of linked list
free(tail->next); // deallocate node we just came from
tail->next = NULL; // define new tail of linked list
}
free(list); // deallocate head of linked list
return(NULL);
}
/*----------------------------------------------------------------------------
* Return the tail of a linked list.
*
* "list" - linked list to return the tail of
*
* RETURNS:
* = tail of linked list
*/
llist *lst_tail(llist *list)
{
if (!list) return( NULL ); // empty linked list
while (list->next) // while there is a next node
list = list->next; // hop to next node
return(list); // return tail of linked list
}
/*----------------------------------------------------------------------------
* Unlink a node from a doubly linked list.
*
* "head" - pointer to first node of linked list
* "unlink" - node to unlink
*
* RETURNS:
* = next available node
* = NULL if linked list is empty
*/
llist_double *lst_unlink_double(llist_double **head, llist_double *unlink)
{
llist_double *next; // next node of linked list
next = unlink->next; // next node
if (!unlink->prev) {
/* unlink the first node */
*head = next;
if (next) next->prev = NULL; // new beginning of linked list
}
else {
unlink->prev->next = next; // unlink node "unlink"
if (next) next->prev = unlink->prev;
}
free(unlink); // deallocate this node
return( next );
}
/*----------------------------------------------------------------------------
* Unlink a node from a singly linked list.
*
* "head" - pointer to first node of linked list
* "unlink" - node to unlink
*
* RETURNS:
* = next available node
* = NULL if linked list is empty
*/
llist_single *lst_unlink_single(llist_single **head, llist_single *unlink)
{
llist_single *next, *prev; // next/previous nodes of linked list
next = unlink->next; // next node of linked list
if (*head == unlink) {
/* unlink the first node */
*head = next; // new beginning of linked list
}
else {
for (prev = *head; prev->next != unlink; prev = prev->next);
prev->next = next; // unlink node "unlink"
}
free(unlink); // deallocate this node
return( next );
}
/*============================== END-OF-FILE =============================*/